﻿using System;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SoftwareConsulting.Interfaces.BasicEntities;

namespace SoftwareConsulting.BI11.Studio.BasicEntities
{    
    /// <summary>
    /// Класс именованного списка
    /// </summary>
    public sealed class NamedList:INamedList
    {
        private Dictionary<string,object> _list;
        private object _tag;
        
        /// <summary>
        /// Возвращает/устанавливает пользовательский тэг
        /// </summary>
        public object Tag
        {
            get
            {
                return _tag;
            }
            set
            {
                _tag = value;
            }
        }

        /// <summary>
        /// Добавляет новое значение в список
        /// </summary>
        /// <param name="elementName"></param>
        /// <param name="elementValue"></param>
        public void AddValue(string elementName, object elementValue)
        {
            _list.Add(elementName, elementValue);
        }

        /// <summary>
        /// Обновляет имеющееся значение в списке
        /// </summary>
        /// <param name="elementName"></param>
        /// <param name="elementValue"></param>
        public void UpdateValue(string elementName, object elementValue)
        {
            _list[elementName] = elementValue;
        }

        /// <summary>
        /// Возвращает значение из списка
        /// </summary>
        /// <param name="elementName"></param>
        /// <returns></returns>
        public object GetValue(string elementName)
        {
            return _list[elementName];
        }

        /// <summary>
        /// Возвращает признак того, содержит ли список указанный элемент
        /// </summary>
        /// <param name="elementName"></param>
        /// <returns></returns>
        public bool IsElementExists(string elementName)
        {
            return _list.ContainsKey(elementName);
        }

        /// <summary>
        /// Возвращает признак того, содержит ли список указанное значение
        /// </summary>
        /// <param name="elementValue"></param>
        /// <returns></returns>
        public bool IsValueExists(object elementValue)
        {
            return _list.ContainsValue(elementValue);
        }                    

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
        
        public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
        {
            return _list.GetEnumerator();
            //return _list.GetEnumerator() as IEnumerator<KeyValuePair<string, object>>;
        }

        /// <summary>
        /// Возвращает число значений в списке
        /// </summary>
        public int Count
        {
            get
            {
                return _list.Count;
            }
        }
        
        /// <summary>
        /// Конструктор класса
        /// </summary>
        public NamedList()
        {
            _list = new Dictionary<string, object>();
        }
    }
}
